#include <iostream>
#include <opencv2/opencv.hpp>
#include <io.h>
#include <opencv2/core/utils/logger.hpp>
#include <ctime>

#include "onnx_run.h"
#include "cmdline.h"

int main(int argc, char *argv[]) {
    //LOG_LEVEL_ERROR - 只输出错误日志 / LOG_LEVEL_SILENT - 不在输出日志
    cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR);

    // 创建一个命令行解析器;
//    cmdline::parser cmd;
    // 加入指定类型的输入参数  长名称，短名称(\0表示没短名)，参数描写叙述，是否必须传值(bool值)，参数默认值;
//    cmd.add<std::string>("model_path", 'm', "Path to onnx model.", false, "../models/yolov5s.onnx");
//    cmd.add<std::string>("image_file", 'i', "Image file source to be detected.", false,
//                         "D:/my_program/study-c/bushu/yolo-onnxruntime-test/images");
//    cmd.add<int>("device", '\0', "cuda device, 0--gpu  or -1--cpu", false, 0);

    // 传入命令行，进行分析，不符合时输出信息，退出程序;
//    cmd.parse_check(argc, argv);

//    int device = cmd.get<int>("device");
//    bool isGPU = device >= 0;
//    const std::string images_path = cmd.get<std::string>("image_file");
//    const std::string onnx_path = cmd.get<std::string>("model_path");

    // 图像全路径单斜杠需要转义，或者需要R"()"这样
    // 检测路径
    std::string images_path = R"(D:\my_program\project\L_dianchi-20230404\data\L_dianchi_1\all_data\crop\images)";
    // 模型路径
    std::string onnx_path = R"(D:\my_program\project\L_dianchi-20230404\data\yolov5_detect\weights\best_20230407.onnx)";
    // 框和iou置信度
    const float conf_threshold = 0.3f;
    // 检测类别
    const std::vector<std::string> class_names = {"ng"};

    // 存储文件信息的结构体
    struct _finddata_t file_info;
    std::string current_path = images_path + "/*.jpg";  // 查找特定后缀的文件，支持通配符
    // 第一次查找，查找成功返回longlong型的句柄，失败返回-1
    long long handle = _findfirst(current_path.c_str(), &file_info);

    // 调用构造函数，初始化模型
    YoloDetect yolo_detect(onnx_path, conf_threshold);
    // 存储画框图
    cv::Mat img;
    // 存储输出结果
    std::vector<Detection> result;

    double start, end, t;
    do {
        // 单张图像路径
        std::string img_path = images_path + "/" + file_info.name;

        // Mat是创建一个数组
        // IMREAD_COLOR/1-默认彩色  IMREAD_GRAYSCALE/0-灰度显示
        // IMREAD_UNCHANGED/-1-四通道png
        img = cv::imread(img_path, 1);

        start = clock();
//        for(int i=0;i<100;i++){
//            // 侦测
//            result = yolo_detect.detect(draw_img);
//        }

        // 侦测
        result = yolo_detect.detect(img);
        DrawImg(img, result, class_names);

        end = clock();
        // 计算毫秒ms
        t = (end - start) / CLOCKS_PER_SEC * 1000;
        std::cout << "detect_time: " << t << std::endl;

        std::cout << "out_boxes: " << result.size() << std::endl;
        std::cout << "============================" << std::endl;

        cv::namedWindow("show_img", cv::WINDOW_NORMAL);
        cv::imshow("show_img", img);
        cv::waitKey(0);


    } while (!_findnext(handle, &file_info));  // 查找下一个
    _findclose(handle);  // 关闭


    cv::destroyAllWindows();  // 销毁窗口
    system("pause");
}